<?php

include_once dirname(__FILE__)."/../disposer/baseMsgDisposer.php";

/**
* 微信消息接受处理类. 按接收到的消息类型，调用不同的处理器
*/
class MsgDispatcher
{
	
	function dispatch(){

		//获取微信发来的数据包信息
  		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

  		//记录访问日志
        print_log("postStr:".$postStr);

        try {

        	// 如果提交信息为空， 不做任何处理
	        if(empty($postStr)) throw new Exception("postStr is null", 1);	        

	        //解析数据包
	    	libxml_disable_entity_loader(true);

	    	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);

	    	$msgType = $postObj->MsgType;   //信息类型{event,text,image,voice,video,shortvideo,location,link}

	    	// print_log("msgType:".$msgType);

		    //根据消息类型，加载不同处理类。调用处理方法
		    $disposer_fileName=$msgType."MsgDisposer.php";

			$disposer_className=$msgType."MsgDisposer";

			$disposer_filePath= dirname(__FILE__)."/../disposer/".$disposer_fileName;

			//检查文件是否存在，如果如果存在，调用处理方法
			if(!file_exists($disposer_filePath)){

				throw new Exception("disposer not found. for:$disposer_filePath", 1);
				
			}

			// print_log("filePath:".$disposer_filePath);

			//加载对应 disposer 文件
			include $disposer_filePath;

			//实例化 disposer 类
			$disposer =new $disposer_className();	

			// print_log("className:".$disposer_className);	

			//执行action中的对应处理方法
			$result=$disposer->dispose($postObj);

			print_log("result:".$result);

			echo "$result";
        	
        } catch (Exception $e) {

        	//显示错误信息
			print_log("Code:".$e->getCode());
			print_log("Message:".$e->getMessage());
			print_log("in:".$e->getFile()."  [line:".$e->getLine()."] ");

        	echo "";
        	
        }

	}
}
